PLAT ?= none
PLATS = linux freebsd macosx

CC ?= gcc

# 这些都是伪目标
.PHONY : none $(PLATS) clean all cleanall

# 原意是 PLAT == none时，就定义default这个伪目标，现在去掉条件了
#ifneq ($(PLAT), none)
.PHONY : default

default :
	$(MAKE) $(PLAT)
#endif

# 如果make指令不显式指定目标的话 -> default作为最终目标 -> PLAT = none -> 告警玩家
none :
	@echo "Please do 'make PLATFORM' where PLATFORM is one of these:"
	@echo "   $(PLATS)"

# 多线程库、数学库
SKYNET_LIBS := -lpthread -lm
SHARED := -fPIC --shared
EXPORT := -Wl,-E

# 可以通过make指令选择编译目标平台的代码
# 在什么平台上编译，就直接编译对应平台的代码就好；在linux上编译macosx平台的应用程序，虽然有办法做到，但是有各种问题需要处理掉
linux : PLAT = linux
macosx : PLAT = macosx
freebsd : PLAT = freebsd

macosx : SHARED := -fPIC -dynamiclib -Wl,-undefined,dynamic_lookup
macosx : EXPORT :=

# 附加动态链接库，里面有dlopen、dlsym、dlclose、dlerror等接口
macosx linux : SKYNET_LIBS += -ldl
# 多线程相关的库
linux freebsd : SKYNET_LIBS += -lrt

# Turn off jemalloc and malloc hook on macosx
# MALLOC_STATICLIB 和 SKYNET_DEFINES 这俩变量的数值定了之后就不会变了
macosx : MALLOC_STATICLIB :=
macosx : SKYNET_DEFINES :=-DNOUSE_JEMALLOC

# all是编译的最终目标
linux macosx freebsd :
	$(MAKE) all PLAT=$@ SKYNET_LIBS="$(SKYNET_LIBS)" SHARED="$(SHARED)" EXPORT="$(EXPORT)" MALLOC_STATICLIB="$(MALLOC_STATICLIB)" SKYNET_DEFINES="$(SKYNET_DEFINES)"
